from datetime import datetime

from flask import Flask, render_template
from classes import base

app = Flask(__name__)

"""传递参数"""


@app.route('/')
def hello_world():  # put application's code here
    person = base.Person(name="wang", age=19)
    return render_template("index.html", id="wanghuamin", person=person)


"""过滤器函数:将网页中接收到的值，放到函数中并返回  方法：后端：1.写一个函数  2.注册函数（注意可以设置新名字）   前端：3.｛｛接收后端的值|过滤器注册名｝｝  """


def speak(say_something):
    return say_something


app.add_template_filter(speak, 'speak')  # 把过滤器添加进去（即注册），然后才能在html中使用


# 后端使用过滤器：1.先将后端的值传递到页面  2.前端接收并处理
@app.route('/filter')
def filter_demo():
    print(f"过滤器运行中")
    return render_template("filter.html", say="真没意思！")


"""前端处理   方法：1.在html页面中，用{% %}包裹处理语句 2.要注意每个控制结构需要结束标志，如{%end if%}"""


# 传递需要处理的参数
@app.route("/control")
def control_statement():
    age = 17
    return render_template("control.html", age=age)


'''html 页面的继承:
1.设置好父类：需要变动的地方“挖坑”（通过｛% block 名字 %｝｛% endblock %｝） 
2.设置子类：设置{% extends "father_html.html" %}，然后在对应block“填坑（写法同上）”
'''


@app.route("/extends")
def extends():
    return render_template("child_html.html")


"""加载静态页面:1.内容得放在static文件夹下  2.对应html中：src="{{ url_for("static",filename="js/js.js") }}"  """


@app.route("/mystatic")
def mystatic():
    return render_template("static.html")


"""数据库：1.pip install pymysql  2.pip install flask-sqlalchemy"""
# 导包
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import text

# MySQL 所在的主机名
HOSTNAME = "127.0.0.1"

# MySQL 监听的端口号，默认3306
PORT = 3306

# 连接MySQL的用户名，请替换成您自己的设置
USERNAME = "root"

# 连接MySQL的密码，请替换成您自己的密码
PASSWORD = "root"

# MySQL上创建的数据库名称
DATABASE = "database_learn"

# 设置SQLAlchemy的数据库连接URI
app.config[
    'SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"

# 在app.config中设置好链接数据库的信息
# 然后使用SQLALchemy(app)创建一个db对象
# SQLALchemy会自动读取app.config中连接数据库的信息
db = SQLAlchemy(app)


# # #################测试####################################
# with app.app_context():
#     with db.engine.connect() as conn:
#         # 使用 text 函数包装 SQL 语句
#         rs = conn.execute(text("select 1"))
#         print(rs.fetchone())  # 输出(1,)表示链接数据库成功

# 通过ORM技术，生成数据库表
# 创建user表
class User(db.Model):
    __tablename__: "user"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(100), nullable=True)
    shouji = db.Column(db.String(100), nullable=True)


# --------数据库的增删查改--------
def add_user():
    # 1.创建ORM对象
    user = User(username="张三", password="1111",email="11@qq.com")
    # 2.将ORM对象添加到db.session中
    db.session.add(user)
    # 3.将db.session中的改变同步到数据库中
    db.session.commit()
    print("添加用户成功")


def query_user():
    # ---1.get查找，根据主键查找
    user = User.query.get(1)
    print(f"{user.id}:{user.username}:{user.password}")
    # ---2.filter_by查找
    # Query:类数组
    # users=User.query.filter_by(username="张三")
    # for user in users:
    #     print(user.username)
    # ----3.查找第一条数据
    user = User.query.first()
    print(user.username)


def update_user():
    user = User.query.filter_by(username="张三").first()  # 加上first好处：当查找为空时不会报错，返回的是None
    user.password = "22222"
    db.session.commit()


def delete_user():
    # 1.查找
    user = User.query.filter_by(username="张三").first()
    # 2.从db.session中删除
    db.session.delete(user)  # 如果user为空则报错
    # 3.同步到数据库
    db.session.commit()
    print("删除成功！")


# ----外键-----
class Article(db.Model):
    __tablename__ = "artical"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text, nullable=False)
    # 添加外键
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    author = db.relationship("User", backref="articles")  # backref="articles"可以使得作者user.articles可以拿到所有文章


# with app.app_context():  # 写入数据库（要在app环境下）
#     db.create_all()    # 由于此方法无法后期添加字段，因此弃用
# ---可后期添加字段的方法：pip install flask-migrate------
from flask_migrate import Migrate
migrate = Migrate(app, db)
# 需要手动在终端映射新添加的数据表
# 1.flask db init:这步只需要执行一次
# 2.flask db migrate:识别ORM模型的改变，生成迁移脚本
# 3.flask db upgrade:运行迁移脚本，同步到数据库中


# ---------------启动模块-------------------------------------
if __name__ == '__main__':
    with app.app_context():
        add_user()

    app.run(host='0.0.0.0', port=5000, debug=True)
